package so.sao.shop.supplier.service;


import com.github.pagehelper.PageInfo;
import so.sao.shop.supplier.domain.Purchase;
import so.sao.shop.supplier.kingdee.domain.Trade;
import so.sao.shop.supplier.kingdee.input.TradeParameterInput;
import so.sao.shop.supplier.pojo.Result;
import so.sao.shop.supplier.pojo.input.*;
import so.sao.shop.supplier.pojo.output.OrderCancelReasonOutput;
import so.sao.shop.supplier.pojo.output.OrderRefuseReasonOutput;
import so.sao.shop.supplier.pojo.output.PurchaseItemPrintOutput;
import so.sao.shop.supplier.pojo.vo.OrderRefundLogisticsVo;
import so.sao.shop.supplier.pojo.vo.PurchaseInfoVo;
import so.sao.shop.supplier.pojo.vo.PurchaseItemVo;
import so.sao.shop.supplier.pojo.vo.PurchasesVo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * 订单信息  service 接口
 * </p>
 *
 * @author 透云-中软-西安项目组
 * @since 2017-07-19
 */
public interface PurchaseService {
    /**
     * 保存订单信息
     *
     * @param purchase 订单对象
     * @return
     */
    public Map<String, Object> savePurchase(PurchaseInput purchase) throws Exception;

    /**
     * 根据订单ID获取订单详情
     *
     * @param orderId orderId
     * @return PurchaseInfoVo
     * @throws Exception Exception
     */
    PurchaseInfoVo findById(String orderId) throws Exception;

    /**
     * 查询订单列表
     *
     * @param purchaseSelectInput
     * @return list
     */
    PageInfo<PurchasesVo> searchOrders(PurchaseSelectInput purchaseSelectInput) throws Exception;

    /**
     * 发货接口
     *
     * @param orderId
     * @return
     */
    void deliverGoods(String orderId, Integer receiveMethod, String name, String number) throws Exception;

    /**
     * 删除订单，批量删除和单个删除
     *
     * @param orderIds
     * @return boolean
     */
    void deletePurchase(String orderIds);

    /**
     * POI导出(当前页/所选页/全部)订单列表
     *
     * @param request   request
     * @param response  response
     * @param pageNum   pageNum
     * @param pageSize  pageSize
     * @param accountId accountId
     */
    void exportExcel(HttpServletRequest request, HttpServletResponse response, String pageNum, Integer pageSize, Long accountId, PurchaseSelectInput purchaseSelectInput) throws Exception;

    /**
     * 根据商家编号及查询条件（起始创建订单-结束创建订单时间/起始下单时间-结束下单时间/起始-结束金额范围;支付流水号/订单编号/收货人名称/收货人联系方式）查找所有相关订单记录(分页)
     *
     * @param pageNum  当前页码
     * @param pageSize 每页显示条数
     * @param input    查询条件封装类
     * @param storeId  商家编号
     * @return 出参
     */
    Result<PageInfo> searchPurchasesHigh(Integer pageNum, Integer pageSize, AccountPurchaseInput input, Long storeId) throws ParseException;


    /**
     * 通过商户ID查询订单状态，并返回总金额
     *
     * @param storeId
     * @return
     */
    BigDecimal findOrderStatus(Long storeId);

    /**
     * 根据订单ID获取订单状态
     *
     * @param orderId
     * @return
     */
    Integer findOrderStatus(String orderId);

    /**
     * 根据支付ID获取订单ID列表
     *
     * @param payId
     * @return
     */
    List<String> findOrderStatusByPayId(String payId);

    /**
     * 查询配送单信息
     * <p>
     * 根据订单编号查询配送单页面的所有信息。
     * 1.查询订单信息；
     * 2.查询商品条目；
     * 3.将订单信息和商品条目封装到output对象；
     * 4.在实体类属性的get方法中格式化数据。
     *
     * @param orderId 订单编号
     * @return 返回一个PurchaseItemPrintOutput对象
     * @throws Exception 异常
     */
    PurchaseItemPrintOutput getPrintItems(String orderId) throws Exception;

    /**
     * 生成单个收货二维码
     * <p>
     * 根据订单编号实现二维码的生成，上传，保存到数据库。
     * 1.验证订单,验证订单和二维码的关系；
     * 2.生成二维码图片。
     * 3.将二维码图片上传到云端；
     * 4.将二维码信息保存到数据库；
     * 5.删除本地图片。
     *
     * @param orderId 订单编号
     * @throws Exception 异常
     */
    void createReceivingQrcode(String orderId) throws Exception;

    /**
     * 扫描二维码收货
     * <p>
     * 根据订单编号实现收货逻辑。
     * 1.验证是否可以扫码收货；
     * 2.将订单状态改为已收货；
     * 3.将二维码状态改为失效，并记录失效时间；
     * 4.推送收货消息。
     *
     * @param orderId 订单编号
     * @return 返回Map：flag：成功true|失败false,message:信息
     * @throws Exception 异常
     */
    Map sweepReceiving(String orderId) throws Exception;

    /**
     * 添加拒收货信息
     * <p>
     * 将拒收理由及相关图片保存
     *
     * @param refuseOrderInput 封装了订单编号，拒收理由，拒收图片
     * @return Map 封装结果 键flag的值为true表示成功，false表示失败，message的值表示文字描述
     */
    void refuseOrder(RefuseOrderInput refuseOrderInput) throws Exception;

    /**
     * 根据订单ID获取该订单的拒收原因
     *
     * @param orderId 订单ID
     * @return map 封装了所有订单拒收原因信息
     */
    OrderRefuseReasonOutput searchRefuseReasonByOrderId(String orderId) throws Exception;

    /**
     * 根据商家编号及查询条件（起始创建订单-结束创建订单时间/支付流水号/订单编号/收货人名称）查找所有相关订单记录(分页)
     *
     * @param pageNum  当前页码
     * @param pageSize 每页显示条数
     * @param input    查询条件封装类
     * @param storeId  商家编号
     * @return 出参
     */
    Result<PageInfo> searchPurchasesLow(Integer pageNum, Integer pageSize, AccountPurchaseLowInput input, Long storeId) throws ParseException;

    /**
     * 添加取消订单信息
     *
     * @param cancelReasonInput 封装了订单编号，取消理由
     * @return Map 封装结果 键flag的值为true表示成功，false表示失败，message的值表示文字描述
     * @throws Exception
     */
    void cancelOrder(CancelReasonInput cancelReasonInput) throws Exception;

    /**
     * 根据订单编号查询取消订单原因
     *
     * @param orderId 订单编号
     * @return 取消订单原因
     * @throws Exception
     */
    OrderCancelReasonOutput searchCancelReasonByOrderId(String orderId) throws Exception;

    /**
     * 根据订单编号实现退款逻辑
     * <p>
     * 根据订单编号验证订单、修改订单状态、调用退款接口、推送退款消息。
     * 1.根据订单状态验证是否可以退款（仅已取消（7）和已拒收（5）状态的订单可以退款，其他状态不可以退款）；
     * 2.修改订单状态为退款，修改退款时间为当前时间；
     * 3.调用退款接口实现真正的退款；
     * 4.修改库存；
     * 5.推送退款消息。
     *
     * @param orderId 订单编号
     * @return 返回Map：flag：成功true|失败false,message:信息
     * @throws Exception 异常
     */
    Map refundByOrderId(String orderId) throws Exception;


    /**
     * 更改订单状态为已完成
     * @param purchasesVos 订单列表
     * @param purchaseItemVoList 详情列表
     * @return
     */
    boolean updateRefundOrderStatus(List<PurchasesVo> purchasesVos,List<PurchaseItemVo> purchaseItemVoList);

    /**
     * 根据支付id，批量生成订单的二维码
     *
     * @param payId 支付id
     * @throws Exception 异常
     */
    void createReceivingQrcodeByPayId(String payId) throws Exception;

    /**
     * 根据订单状态查询订单ID
     *
     * @param orderStatus 订单状态
     * @return String 订单ID
     * @throws Exception 异常
     */
    List<String> findOrderIdByOrderStatus(Integer orderStatus) throws Exception;

    /**
     * 根据订单编号和用户id验证用户的订单是否存在，存在返回二维码地址，否则返回失败地址
     *
     * @param orderId 订单编号
     * @param userId 用户id
     * @return url地址
     */
    String getReceiveUrl(String orderId, String userId);

	/**
     * 根据供应商ID查询各类订单数量
     * @param accountId
     * @return
     */
    Map<Object, Object> countOrderNumByOrderStatus(Long accountId);

    /**
     * 更改物流信息
     *
     * @param logisticInfoUpdateInput 封装了订单ID，物流公司，物流单号
     */
    boolean updateLogisticInfoByOrderId(LogisticInfoUpdateInput logisticInfoUpdateInput);

    /**
     * 管理员POI导出(当前页/所选页/全部)订单列表
     *
     * @param request   request
     * @param response  response
     * @param pageNum   pageNum
     * @param accountId accountId
     * @param pageSize  pageSize
     */
    void adminExportExcel(HttpServletRequest request, HttpServletResponse response, String pageNum, Integer pageSize, Long accountId, PurchaseSelectInput purchaseSelectInput) throws Exception;

    /**
     * 根据订单ID集合获取订单详情集合
     *
     * @param orderIds 订单ID集合
     * @return List<PurchaseInfoVo>
     */
    List<PurchaseItemVo> findPurchaseItemByIds(List<String> orderIds);

    /**
     * 订单详情-发票详情
     * @param orderId
     * @return Result 结果
     */
    Result findReceiptItemByOrderId(String orderId);

    /**
     * 金蝶_查询卖家已卖出的交易数据
     * @param tradeParameterInput tradeParameterInput
     * @return PageInfo<Trade>
     */
    PageInfo<Trade> getTradeList(TradeParameterInput tradeParameterInput);

    /**
     * 【v1.2.0】供应商查询拒收详情接口
     * @param orderId 订单ID
     * @return
     */
    Result findRefuseOrderDetails(String orderId) throws Exception;
     /**
     * 根据订单状态查询订单ID的list
     *
     * @return List<String> 订单ID的list
     */
    List<PurchasesVo> findOrderIdByStatus();

	 /**
     * 根据时间过滤订单ID
     * @param refundWholeOrderIds 状态筛选后的ID集合
     * @return List<String> 订单ID结合
     */
    List<String> getOrderIdByTime(List<String> refundWholeOrderIds);

    /**
     * 通过订单ID集合查询回寄物流单号
     * @param refundWholeOrderIds 订单ID集合
     * @param detailIds 详情ID
     * @return List<OrderRefundLogisticsVo>
     */
    List<OrderRefundLogisticsVo> getRefundOrderLogistics(List<String> refundWholeOrderIds, List<BigInteger> detailIds);

    /**
     * 根据订单状态获取订单列表
     *
     * @param orderStatus 订单状态
     * @return List<PurchasesVo>订单列表
     */
    List<PurchasesVo> getOrderInfoByOrderStatus(Integer orderStatus);
	
    /**
     * 【v1.2.0】供应商审核拒收退款申请（同意/拒绝）
     *
     * @param accountId
     * @param orderId 订单编号
     * @param status 同意/拒绝
     * @param storeRefuseReason 拒绝原因
     * @return
     */
    Result checkApplication(Long accountId, String orderId, Integer status, String storeRefuseReason);

    /**
     * 根据订单状态获取相关状态的全部记录
     * @param status
     * @return
     */
    List<Purchase> getOrderByStatus(Integer status);

    /**
     * 根据入参中的状态修改子订单状态
     *
     * @param orderIds
     * @param status 状态
     * @return
     */
    int updateOrderStatus(List<String> orderIds, Integer status);

    /**
     * 根据退款号获取订单ID
     * @param returnNum 退款号
     * @return
     */
    String getOrderByReturnNum(String returnNum);
}
